/**
 * @file logger.h
 * @brief 通用日志系统头文件
 * @author 开发者
 * @date 2024
 */

#ifndef LOGGER_H
#define LOGGER_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>
#include <sys/time.h>
#include <pthread.h>
#include <stdbool.h>

// 日志级别定义
typedef enum {
    LOG_LEVEL_TRACE = 0,    // 跟踪级别（最详细）
    LOG_LEVEL_DEBUG,        // 调试级别
    LOG_LEVEL_INFO,         // 信息级别
    LOG_LEVEL_TEST,         // 测试级别
    LOG_LEVEL_WARN,         // 警告级别
    LOG_LEVEL_ERROR,        // 错误级别
    LOG_LEVEL_FATAL,        // 致命错误级别
    LOG_LEVEL_OFF           // 关闭日志
} log_level_t;

// 日志输出目标
typedef enum {
    LOG_TARGET_CONSOLE = 0, // 控制台输出
    LOG_TARGET_FILE,        // 文件输出
    LOG_TARGET_SYSLOG,      // 系统日志
    LOG_TARGET_NETWORK      // 网络输出
} log_target_t;

// 日志配置结构
typedef struct {
    log_level_t level;           // 日志级别
    log_target_t target;         // 输出目标
    char *file_path;             // 文件路径（文件输出时使用）
    size_t max_file_size;        // 最大文件大小（字节）
    int max_files;               // 最大文件数量
    bool color_output;           // 是否启用彩色输出
    bool timestamp;              // 是否显示时间戳
    bool thread_id;              // 是否显示线程ID
    bool file_line;              // 是否显示文件名和行号
    bool async_output;           // 是否异步输出
    int buffer_size;             // 缓冲区大小
} log_config_t;

// 日志统计信息
typedef struct {
    unsigned long long trace_count;  // 跟踪日志数量
    unsigned long long debug_count;  // 调试日志数量
    unsigned long long info_count;   // 信息日志数量
    unsigned long long test_count;   // 测试日志数量
    unsigned long long warn_count;   // 警告日志数量
    unsigned long long error_count;  // 错误日志数量
    unsigned long long fatal_count;  // 致命错误日志数量
    unsigned long long total_count;  // 总日志数量
    time_t start_time;               // 开始时间
    time_t last_log_time;            // 最后日志时间
} log_stats_t;

// 函数声明

/**
 * @brief 初始化日志系统
 * @param config 日志配置
 * @return 成功返回0，失败返回-1
 */
int logger_init(const log_config_t *config);

/**
 * @brief 清理日志系统
 */
void logger_cleanup(void);

/**
 * @brief 设置日志级别
 * @param level 日志级别
 */
void logger_set_level(log_level_t level);

/**
 * @brief 获取当前日志级别
 * @return 当前日志级别
 */
log_level_t logger_get_level(void);

/**
 * @brief 设置日志输出目标
 * @param target 输出目标
 * @param file_path 文件路径（文件输出时使用）
 * @return 成功返回0，失败返回-1
 */
int logger_set_target(log_target_t target, const char *file_path);

/**
 * @brief 启用/禁用彩色输出
 * @param enable 是否启用
 */
void logger_set_color(bool enable);

/**
 * @brief 启用/禁用时间戳
 * @param enable 是否启用
 */
void logger_set_timestamp(bool enable);

/**
 * @brief 启用/禁用线程ID显示
 * @param enable 是否启用
 */
void logger_set_thread_id(bool enable);

/**
 * @brief 启用/禁用文件名和行号显示
 * @param enable 是否启用
 */
void logger_set_file_line(bool enable);

/**
 * @brief 启用/禁用异步输出
 * @param enable 是否启用
 */
void logger_set_async(bool enable);

/**
 * @brief 获取日志统计信息
 * @param stats 输出统计信息
 */
void logger_get_stats(log_stats_t *stats);

/**
 * @brief 重置日志统计信息
 */
void logger_reset_stats(void);

/**
 * @brief 刷新日志缓冲区
 */
void logger_flush(void);

/**
 * @brief 轮转日志文件
 * @return 成功返回0，失败返回-1
 */
int logger_rotate(void);

// 日志输出宏定义
#define LOG_TRACE(fmt, ...)   logger_log(LOG_LEVEL_TRACE, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)
#define LOG_DEBUG(fmt, ...)   logger_log(LOG_LEVEL_DEBUG, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)
#define LOG_INFO(fmt, ...)    logger_log(LOG_LEVEL_INFO, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)
#define LOG_TEST(fmt, ...)    logger_log(LOG_LEVEL_TEST, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)
#define LOG_WARN(fmt, ...)    logger_log(LOG_LEVEL_WARN, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)
#define LOG_ERROR(fmt, ...)   logger_log(LOG_LEVEL_ERROR, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)
#define LOG_FATAL(fmt, ...)   logger_log(LOG_LEVEL_FATAL, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)

// 条件日志宏
#define LOG_TRACE_IF(condition, fmt, ...)   do { if (condition) LOG_TRACE(fmt, ##__VA_ARGS__); } while(0)
#define LOG_DEBUG_IF(condition, fmt, ...)   do { if (condition) LOG_DEBUG(fmt, ##__VA_ARGS__); } while(0)
#define LOG_INFO_IF(condition, fmt, ...)    do { if (condition) LOG_INFO(fmt, ##__VA_ARGS__); } while(0)
#define LOG_TEST_IF(condition, fmt, ...)    do { if (condition) LOG_TEST(fmt, ##__VA_ARGS__); } while(0)
#define LOG_WARN_IF(condition, fmt, ...)    do { if (condition) LOG_WARN(fmt, ##__VA_ARGS__); } while(0)
#define LOG_ERROR_IF(condition, fmt, ...)   do { if (condition) LOG_ERROR(fmt, ##__VA_ARGS__); } while(0)
#define LOG_FATAL_IF(condition, fmt, ...)   do { if (condition) LOG_FATAL(fmt, ##__VA_ARGS__); } while(0)

// 断言宏
#define LOG_ASSERT(condition, fmt, ...)     do { if (!(condition)) LOG_FATAL("ASSERTION FAILED: " fmt, ##__VA_ARGS__); } while(0)

// 性能测试宏
#define LOG_PERF_START(name)                do { \
    struct timeval start_time_##name; \
    gettimeofday(&start_time_##name, NULL); \
    LOG_DEBUG("PERF_START: %s", #name);

#define LOG_PERF_END(name)                  do { \
    struct timeval end_time_##name, diff_time_##name; \
    gettimeofday(&end_time_##name, NULL); \
    timersub(&end_time_##name, &start_time_##name, &diff_time_##name); \
    LOG_DEBUG("PERF_END: %s, elapsed: %ld.%06lds", #name, \
              diff_time_##name.tv_sec, diff_time_##name.tv_usec); \
} while(0)

// 内存使用宏
#define LOG_MEMORY_USAGE()                  do { \
    FILE *file = fopen("/proc/self/status", "r"); \
    if (file) { \
        char line[256]; \
        while (fgets(line, sizeof(line), file)) { \
            if (strncmp(line, "VmRSS:", 6) == 0) { \
                LOG_DEBUG("MEMORY: %s", line); \
                break; \
            } \
        } \
        fclose(file); \
    } \
} while(0)

// 内部函数声明（不对外暴露）
void logger_log(log_level_t level, const char *file, int line, const char *func, 
                const char *format, ...);

// 便捷函数
const char* logger_level_to_string(log_level_t level);
const char* logger_level_to_color(log_level_t level);
log_level_t logger_string_to_level(const char *level_str);

// 默认配置
extern const log_config_t LOGGER_DEFAULT_CONFIG;

#endif // LOGGER_H
